{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "4c3e498a",
   "metadata": {},
   "source": [
    "## Identifying Latent Return Drivers Using Principal Component Analysis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "687e885a",
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install sklearn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "cb273d19",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from IPython.display import Markdown, display\n",
    "from openbb import obb\n",
    "from sklearn.decomposition import PCA"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "c577dda9",
   "metadata": {},
   "outputs": [],
   "source": [
    "obb.user.preferences.output_type = \"dataframe\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "54bbceb4",
   "metadata": {},
   "source": [
    "Define the symbols for gold and healthcare stocks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "33c6d292",
   "metadata": {},
   "outputs": [],
   "source": [
    "symbols = [\"NEM\", \"RGLD\", \"SSRM\", \"CDE\", \"LLY\", \"UNH\", \"JNJ\", \"MRK\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "72d4df11",
   "metadata": {},
   "source": [
    "Fetch historical price data for the defined symbols from 2020-01-01 to 2022-12-31 using the \"yfinance\" provider"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b5aba41f",
   "metadata": {},
   "outputs": [],
   "source": [
    "data = obb.equity.price.historical(\n",
    "    symbols,\n",
    "    start_date=\"2020-01-01\",\n",
    "    end_date=\"2022-12-31\",\n",
    "    provider=\"yfinance\",\n",
    ").pivot(columns=\"symbol\", values=\"close\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ed954f3a",
   "metadata": {},
   "source": [
    "Calculate the daily percentage returns and drop any missing values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "39dc28aa",
   "metadata": {},
   "outputs": [],
   "source": [
    "returns = data.pct_change().dropna()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "79e36b1d",
   "metadata": {},
   "source": [
    "Initialize PCA with 3 components and fit it to the returns data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "5773e5e1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>PCA(n_components=3)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;PCA<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.decomposition.PCA.html\">?<span>Documentation for PCA</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>PCA(n_components=3)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "PCA(n_components=3)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca = PCA(n_components=3)\n",
    "pca.fit(returns)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "df36f73a",
   "metadata": {},
   "source": [
    "Get the explained variance ratio and the principal components"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "798f177a",
   "metadata": {},
   "outputs": [],
   "source": [
    "pct = pca.explained_variance_ratio_\n",
    "pca_components = pca.components_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "7efd8e50",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.78402106,  0.06139341,  0.06157203,  0.06678106,  0.29181296,\n",
       "         0.30862968,  0.42713718,  0.10216529],\n",
       "       [ 0.03070356,  0.34058264,  0.60677508,  0.39052223, -0.09200527,\n",
       "        -0.12445024, -0.22896855,  0.53478754],\n",
       "       [ 0.6180319 , -0.10864359, -0.13197692, -0.07204876, -0.39555206,\n",
       "        -0.41760383, -0.48391774, -0.13635775]])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display(pca_components)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f00bc8d9",
   "metadata": {},
   "source": [
    "Plot the contribution and cumulative contribution of the principal components"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "0fb2af3e",
   "metadata": {},
   "outputs": [],
   "source": [
    "cum_pct = np.cumsum(pct)\n",
    "x = np.arange(1, len(pct) + 1, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "bff8cb2f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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vfaakWQOHjzoMR4SEmLeffdd9/V77rnHjB071hhjzJkzZ0zNmjU9/r+Tmz179hhJZuXKlfnWcTlmWErY6tWrVbduXXcazc/w4cO1aNEi9enTR4888oi2bdumlJQU/e9//9OqVas8lt2/f7/69OmjYcOGadCgQXrttdc0ePBgJSQk6KabblK7du00duxYvfjii3r88cfVoEEDSXL/V5L27t2r++67T6NGjdKIESN04403XrW+0aNHKywsTE899ZT27t2ruXPn6tChQ+6d1QqqILVd7ty5c+rQoYP279+v0aNHKz4+XsuWLdPgwYN16tQpjRs3zmP5xYsX6/Tp0xo1apRsNpumT5+uXr166YcfflDFihXzrGvnzp26cOGCmjZt6jHevHlzvfrqq1q3bp3i4+P1t7/9TS1atJDk2hdn3rx52r59e77POyEhgf0Lillht7nC6tevnxo0aKBp06bpvffe09SpUxUeHq758+erY8eOev755/XGG2/o0UcfVfPmzdWuXTuvPO7s2bPVo0cPDRgwQBcuXNBbb72le++9V2vWrFG3bt0kSf/61780fPhwtWjRQiNHjpQkXXfddXk+j4EDB+rLL79U8+bN3eOHDh3SF198oRkzZrjHnn32WU2aNEl9+/bV8OHDdfz4cb300ktq166d/vOf/ygsLCzPuo8cOaIWLVro1KlTGjlypOrXr6+ff/5Zy5cv12+//aaAgAClp6erdevW+u233zR27FhFRERo0aJF6tGjh5YvX6577rnHY53Tpk2Tn5+fHn30UTkcDk2fPl0DBgzQtm3bJEl/+ctf5HA49NNPP+mFF16QpByf7J955hkFBATo0UcfVWZm5lVndU+ePKm77rpLffv21X333aelS5fq4YcfVkBAQKFnSwtS2+U++ugjde3aVXXr1tVTTz2lc+fO6aWXXlKbNm20a9euHDtn9+3bV/Hx8UpJSdGuXbv06quvqkaNGnr++eevWtfnn3+uiIgIxcbGeow3b95cM2fOVP369fXDDz9o7dq1euWVVyS59peqWbOmHnzwwauuu2HDhgoKCtJnn32W4295VYWKNygSh8NhJJm77767QMvv3r3bSDLDhw/3GH/00UeNJPPxxx+7x2JjY40ks3nzZvfYsWPHjN1uN4888oh77Gr7iWSvY+3atbneltsMS0JCgse+LdOnTzeSzDvvvOMeUwFmWPKr7coZllmzZhlJ5t///rd77MKFCyYxMdEEBwe79wvJ/oQSERHhMfPzzjvvGElm9erVOR7rcq+++qqRZL7++muP8UuXLplevXq5PxHVrl3bfPXVV8YYY+644w7z0EMPXXW92Z577jkjyaSnpxdoeRROYbe5a5lhuXzfpUuXLplatWoZm81mpk2b5h4/efKkCQoKynUbutYZlt9++83j+oULF0yjRo1Mx44dPcbz2oflysd3OBw5+oUxrm3aZrOZQ4cOGWOMOXjwoPH39zfPPvusx3Jff/21qVChQo7xKw0cOND4+fnluv9b9v4048ePN5LMli1b3LedPn3axMfHm7i4OPc+JdmvVYMGDTxmZ2bPnp1ju81rP5HsddStWzfHa5rXDIsk87e//c09lpmZaZo0aWJq1Kjh7oeF+fvmVVtu78fsx/n111/dY3v27DF+fn5m4MCB7rHs9+fQoUM91nnPPfeYiIiIHI91pdtuuy3HrJoxxnz11VemVq1a7t7Xu3dvk5WVZX744QcTFBRktm7dmu+6jTHmhhtuMF27di3Qstk4SqgEZR9FUqVKlQIt//7770uSJkyY4DH+yCOPSFKO790bNmyotm3buq9Xr15dN954o3744YcC1xgfH68uXboUePmRI0d6zFA8/PDDqlChgrv24vL+++8rKipK9913n3usYsWKGjt2rM6cOaNNmzZ5LN+vXz9VrVrVfT37dcrvtfn1118lyeO+kuv7/xUrVmjfvn3asWOHvv/+ezVu3Fjvvvuutm/frmeeeUY///yzunfvrpiYGHXv3l1HjhzJsf7s9f7yyy+FePYoqMJuc9di+PDh7n/7+/urWbNmMsZo2LBh7vGwsLBCb4v5CQoKcv/75MmTcjgcatu2rXbt2nVN6wsJCVHXrl21dOlSGWPc40uWLFGrVq1Up04dSdLKlSvldDrVt29f/fLLL+5LVFSU6tWrp40bN+b5GE6nU2+//ba6d++uZs2a5bg9e1b2/fffV4sWLXTbbbe5bwsODtbIkSN18OBBffvttx73GzJkiMeMSEG378sNGjTI4zW9mgoVKmjUqFHu6wEBARo1apSOHTumnTt3FvgxC+vo0aPavXu3Bg8erPDwcPf4zTffrNtvvz3XvvvQQw95XG/btq1+/fXXHEc1XunXX3/N0fckqXHjxtq3b5++/PJL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MTGKj49Xy5Yt81z3XXfdpSpVqujRRx+Vv7+/evfu7XH7ddddp6lTpyo5OVkHDx5Uz549VaVKFaWmpmrVqlUaOXKk+9N2bp577jmtW7dO7du318iRI9WgQQMdPXpUy5Yt06effqqwsDBNnDhRb775prp27aqxY8cqPDxcixYtUmpqqlasWJFj37WCSEhI0JIlSzRhwgQ1b95cwcHB6t69e6HXI7lmDZ5//nkdPHhQN9xwg5YsWaLdu3drwYIF7oMQCvP3LUxtM2bMUNeuXZWYmKhhw4a5D2sODQ3VU089dU3PJzfdunVThQoV9NFHH7kPib/SpEmT1LhxY4+vDHv37q2nn35aDz/8sGJjYzV//nz3h+xs69evV6VKlXT77bcXrqhCHVMEr/n+++/NiBEjTFxcnAkICDBVqlQxbdq0MS+99JLHSeEuXrxopkyZYuLj403FihVN7dq1r3riuCvldsK1V155xdStW9f4+/vneuK43OR34riqVaua4OBgM2DAAI/D7Yxxnd76scceM9WqVTOVKlUyXbp0Mfv378+xzqvVlteJ44YMGWKqVatmAgICTOPGjXMcjnr5ieOupDwOt77SypUrjc1my/WkWE6n07Rs2dJMmDAhx2379+837dq1M8HBwaZdu3bmwIEDHrfPnTuXU/OXoIJuc7/99psZNmyYCQ0NNVWqVDF9+/Y1x44dy/Ow5uPHj3s8zqBBg0zlypVzPH5up3Q/cOCA6dy5s7Hb7SYyMtI8/vjjZv369QU6rPkf//iHqVevnrHb7aZ+/fpm4cKF7pou991335l27dqZoKCgq5447nIDBgwwkkznzp3zfD1XrFhhbrvtNlO5cmVTuXJlU79+fZOUlGT27t2b532yHTp0yAwcONBUr17d2O12U7duXZOUlJTriePCwsJMYGCgadGiRZ4njrvyhHm5HQ585swZc//995uwsLBcTxx35Touvy2/E8fFxsaav//97znuX9C/b1615XWY/UcffWTatGljgoKCTEhIiOnevXueJ4678v15tb/7lXr06GE6deqU621fffWVCQgIMP/5z39y3Pb666+buLg4ExERYSZMmJDjpwVatmxpHnjggXwf/0o2YwqxVxJQDmVlZalhw4bq27evnnnmGa+t99Zbb1WHDh3cJ4sCACvZsmWLOnTooO+++67QO8jmZffu3WratKl2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VosWLZIkpaWlSZIiIyM97hcZGem+7UopKSkKDQ11X2rXru3tsgH4UHH0DYneAZQlXg8sTqdTTZs21XPPPadbb71VI0eO1IgRIzRv3rxrXmdycrIcDof7cvjwYS9WDMDXiqNvSPQOoCzxemCJjo5Ww4YNPcYaNGigH3/8UZIUFRUlSUpPT/dYJj093X3blex2u0JCQjwuAMqO4ugbEr0DKEu8HljatGmjvXv3eox9//33io2NleTakS4qKkobNmxw356RkaFt27YpMTHR2+UAKAXoGwDy4/WjhP70pz+pdevWeu6559S3b19t375dCxYs0IIFCyRJNptN48eP19SpU1WvXj3Fx8dr0qRJiomJUc+ePb1dDoBSgL4BID9eDyzNmzfXqlWrlJycrKefflrx8fGaNWuWBgwY4F7mz3/+s86ePauRI0fq1KlTuu2227R27VoFBgZ6uxwApQB9A0B+bMYY4+siCisjI0OhoaFyOBw+/046buJ7Pn38a3FwWjdfl4AywErbYUGVxpqBsqQo2yC/JQQAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyPwAIAACyv2APLtGnTZLPZNH78ePfY+fPnlZSUpIiICAUHB6t3795KT08v7lIAlBL0DQBXKtbA8uWXX2r+/Pm6+eabPcb/9Kc/afXq1Vq2bJk2bdqkI0eOqFevXsVZCoBSgr4BIDfFFljOnDmjAQMG6JVXXlHVqlXd4w6HQ//4xz80c+ZMdezYUQkJCVq4cKE+//xzffHFF7muKzMzUxkZGR4XAGWPN/uGRO8AypJiCyxJSUnq1q2bOnfu7DG+c+dOXbx40WO8fv36qlOnjrZu3ZrrulJSUhQaGuq+1K5du7jKBuBD3uwbEr0DKEuKJbC89dZb2rVrl1JSUnLclpaWpoCAAIWFhXmMR0ZGKi0tLdf1JScny+FwuC+HDx8ujrIB+JC3+4ZE7wDKkgreXuHhw4c1btw4rV+/XoGBgV5Zp91ul91u98q6AFhPcfQNid4BlCVen2HZuXOnjh07pqZNm6pChQqqUKGCNm3apBdffFEVKlRQZGSkLly4oFOnTnncLz09XVFRUd4uB0ApQN8AkB+vz7B06tRJX3/9tcfYkCFDVL9+fT322GOqXbu2KlasqA0bNqh3796SpL179+rHH39UYmKit8sBUArQNwDkx+uBpUqVKmrUqJHHWOXKlRUREeEeHzZsmCZMmKDw8HCFhIRozJgxSkxMVKtWrbxdDoBSgL4BID9eDywF8cILL8jPz0+9e/dWZmamunTpojlz5viiFAClBH0DKN9sxhjj6yIKKyMjQ6GhoXI4HAoJCfFpLXET3/Pp41+Lg9O6+boElAFW2g4LqjTWDJQlRdkG+S0hAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeQQWAABgeV4PLCkpKWrevLmqVKmiGjVqqGfPntq7d6/HMufPn1dSUpIiIiIUHBys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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.subplot(1, 2, 1)\n",
    "plt.bar(x, pct * 100, align=\"center\")\n",
    "plt.title(\"Contribution (%)\")\n",
    "plt.xticks(x)\n",
    "plt.xlim([0, 4])\n",
    "plt.ylim([0, 100])\n",
    "\n",
    "plt.subplot(1, 2, 2)\n",
    "plt.plot(x, cum_pct * 100, \"ro-\")\n",
    "plt.title(\"Cumulative contribution (%)\")\n",
    "plt.xticks(x)\n",
    "plt.xlim([0, 4])\n",
    "plt.ylim([0, 100])\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1554eb63",
   "metadata": {},
   "source": [
    "Construct \"statistical risk factors\" from the principal components"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "fd7cc722",
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.asarray(returns)\n",
    "factor_returns = X.dot(pca_components.T)\n",
    "factor_returns = pd.DataFrame(\n",
    "    columns=[\"f1\", \"f2\", \"f3\"], index=returns.index, data=factor_returns\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "0950df5f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>f1</th>\n",
       "      <th>f2</th>\n",
       "      <th>f3</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2020-01-03</th>\n",
       "      <td>-0.028854</td>\n",
       "      <td>-0.007880</td>\n",
       "      <td>0.013453</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-01-06</th>\n",
       "      <td>-0.081176</td>\n",
       "      <td>0.006441</td>\n",
       "      <td>-0.058876</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-01-07</th>\n",
       "      <td>0.003671</td>\n",
       "      <td>-0.015563</td>\n",
       "      <td>-0.013919</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-01-08</th>\n",
       "      <td>-0.105889</td>\n",
       "      <td>0.028154</td>\n",
       "      <td>-0.005643</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-01-09</th>\n",
       "      <td>0.001916</td>\n",
       "      <td>0.018522</td>\n",
       "      <td>0.023465</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2022-12-23</th>\n",
       "      <td>0.001576</td>\n",
       "      <td>0.007398</td>\n",
       "      <td>-0.020952</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2022-12-27</th>\n",
       "      <td>0.079420</td>\n",
       "      <td>-0.010218</td>\n",
       "      <td>0.022537</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2022-12-28</th>\n",
       "      <td>-0.081093</td>\n",
       "      <td>0.004814</td>\n",
       "      <td>0.005850</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2022-12-29</th>\n",
       "      <td>0.010073</td>\n",
       "      <td>0.004415</td>\n",
       "      <td>0.000597</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2022-12-30</th>\n",
       "      <td>-0.032789</td>\n",
       "      <td>-0.003646</td>\n",
       "      <td>-0.022775</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>755 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                  f1        f2        f3\n",
       "date                                    \n",
       "2020-01-03 -0.028854 -0.007880  0.013453\n",
       "2020-01-06 -0.081176  0.006441 -0.058876\n",
       "2020-01-07  0.003671 -0.015563 -0.013919\n",
       "2020-01-08 -0.105889  0.028154 -0.005643\n",
       "2020-01-09  0.001916  0.018522  0.023465\n",
       "...              ...       ...       ...\n",
       "2022-12-23  0.001576  0.007398 -0.020952\n",
       "2022-12-27  0.079420 -0.010218  0.022537\n",
       "2022-12-28 -0.081093  0.004814  0.005850\n",
       "2022-12-29  0.010073  0.004415  0.000597\n",
       "2022-12-30 -0.032789 -0.003646 -0.022775\n",
       "\n",
       "[755 rows x 3 columns]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display(factor_returns)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3bdf5c39",
   "metadata": {},
   "source": [
    "Calculate the factor exposures"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "adb749b9",
   "metadata": {},
   "outputs": [],
   "source": [
    "factor_exposures = pd.DataFrame(\n",
    "    index=[\"f1\", \"f2\", \"f3\"], columns=returns.columns, data=pca_components\n",
    ").T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "8324a77a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>f1</th>\n",
       "      <th>f2</th>\n",
       "      <th>f3</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>symbol</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>CDE</th>\n",
       "      <td>0.784021</td>\n",
       "      <td>0.030704</td>\n",
       "      <td>0.618032</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>JNJ</th>\n",
       "      <td>0.061393</td>\n",
       "      <td>0.340583</td>\n",
       "      <td>-0.108644</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LLY</th>\n",
       "      <td>0.061572</td>\n",
       "      <td>0.606775</td>\n",
       "      <td>-0.131977</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>MRK</th>\n",
       "      <td>0.066781</td>\n",
       "      <td>0.390522</td>\n",
       "      <td>-0.072049</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>NEM</th>\n",
       "      <td>0.291813</td>\n",
       "      <td>-0.092005</td>\n",
       "      <td>-0.395552</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>RGLD</th>\n",
       "      <td>0.308630</td>\n",
       "      <td>-0.124450</td>\n",
       "      <td>-0.417604</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SSRM</th>\n",
       "      <td>0.427137</td>\n",
       "      <td>-0.228969</td>\n",
       "      <td>-0.483918</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>UNH</th>\n",
       "      <td>0.102165</td>\n",
       "      <td>0.534788</td>\n",
       "      <td>-0.136358</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              f1        f2        f3\n",
       "symbol                              \n",
       "CDE     0.784021  0.030704  0.618032\n",
       "JNJ     0.061393  0.340583 -0.108644\n",
       "LLY     0.061572  0.606775 -0.131977\n",
       "MRK     0.066781  0.390522 -0.072049\n",
       "NEM     0.291813 -0.092005 -0.395552\n",
       "RGLD    0.308630 -0.124450 -0.417604\n",
       "SSRM    0.427137 -0.228969 -0.483918\n",
       "UNH     0.102165  0.534788 -0.136358"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display(factor_exposures)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bdde981a",
   "metadata": {},
   "source": [
    "Plot the factor exposure of the first principal component"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "b1df0b09",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: xlabel='symbol'>"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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BQsWBPXTkl999VWjf9O+r0uXLqft2CDCiJ9+9KMfKSkpyXQZaAOWZemWW25RWFiYpGN/kW+77TZ169atUbtgfIrqww8/1OzZs/XSSy/p+uuv186dO0/rx/7Qej179mwxZJ3Os3Keis8//1y9e/eWdKzXMyIiIugnsJSk3//+983+UnU6B0/CiJ969uwZlF9OndH3n6LqLO+jueOOO7RkyRJdfvnl+tvf/qaEhATTJQWEzWbT4cOHFR4e7vsC/uKLL3w9ByfqQeio3nrrLdMlGPP997Ts2bNHtbW1jdoE00zDZ599thYvXnzCNqcjxozghAN4Dx06pI0bNwbdPeXOym63Kzw8XIMHD26xXbBN/vX9p4i+3yMQrDPPdladdabhjoqeESgqKuqE+0/XEdinYsqUKSdsY7PZtGTJkgBUEzhz5swJym75E+nMPQTf9f2p3x0Oh/7t3/7NYEXt40RPCQajN998U5mZmXrnnXeOewN1dXW1Ro0apfz8/NPyVSf0jKDTstvt6t+/v0aMGNHkb0/fePnllwNYFdC2/vrXv8rtdut///d/JR17iujIkSO+P/M2m01//vOf5XK5TJaJNjB+/HhdfvnlzU7WuGjRIr311lun5b9phBF0Wnfeeaf++Mc/qn///srIyNBNN92kM844w3RZ7a5Xr15N9oxERUXpvPPO04wZM3TFFVcYqKx9NTfZ23cF42RvkyZNUkpKin75y19KOhZG1qxZo/79+8uyLC1atEiffPKJXnrpJcOVtq2qqirV1tY2esfSjh079Oijj6q2tlYTJkzQDTfcYLDCtte/f3+tW7dOQ4YMaXL/7t27NWbMmJOehTmQCCPo1Lxer1atWqWCggJt3rxZY8eO1a233qoxY8YE7a2M5cuXN7n90KFD2rJliwoLC/Xiiy8G3eR+q1evbnZfcXGxFi1apIaGBn311VcBrKr9DRo0SC+//LLvSZLvz6/y3nvvaezYsdq/f7/JMtvcpEmT1K9fPy1cuFDSsRl4Bw8erH79+mngwIF6/fXXtWTJEt18882GK2074eHh2r59u84999wm9+/du1dDhw49LecZkQXAsizLKisrs+6//35rwIAB1tlnn20dPnzYdElGLFy40EpJSTFdRkDs3r3bmjBhguVwOKz09HSrrKzMdEltLjw83CovL/etv/TSS1Ztba1vvayszAoNDTVRWruKi4uzNmzY4Ft/5JFHrIEDB1pff/21bz05OdlUee1iwIAB1ssvv9zs/pdeesk655xzAleQH+ymwxBwuvju6PvOPML+6quv1u7du02X0a7279+vadOmaejQoTp69Kjef/99LV++vFGXfrDo0aOHPvzwQ9/6tddeq4iICN/6xx9/fNxgx2BQUVGhuLg43/qbb76pa6+9ViEhx57bGD9+vP7xj38Yqq59XHXVVbrvvvua7N378ssvlZWVpauvvtpAZSdGGEGn5vV69cc//lFXXHGFzjvvPG3btk1PPPGEysvLO91srN/wer0tzuLYkVVXV+vuu+/Wueeeqx07dqioqEivvvpqUE+GlZycrGeffbbZ/cuWLVNycnIAKwqMyMhIHTp0yLdeUlLS6DptNpu8Xq+BytrPvffeq4MHD+q8887TggULtHr1aq1evVrz58/X+eefr4MHD+qee+4xXWbTTHfNAKbcfvvtVq9evaxhw4ZZubm5VmVlpemSTgvTp0+3UlNTTZfR5ubPn2+dccYZVnx8vPXKK6+YLidg3nzzTctut1szZsywPB6Pb7vH47HcbrflcDisoqIigxW2j/Hjx1tTpkyx6uvrrZUrV1qhoaHWwYMHfftfe+01a/DgwQYrbB9lZWXWlVdeadntdstms1k2m82y2+3WlVdeaX300Uemy2sWA1jRadntdp199tkaMWJEi4NVg23GXbfb3eT26upqlZaW6oMPPtBf/vIXJSYmBriy9mW329W1a1e5XC45HI5m2wXbz1uSnnzySd111106evSoIiMjZbPZVF1drZCQEC1cuFCZmZmmS2xzW7dulcvlUk1NjY4eParZs2frwQcf9O2/+eab1a1bN+Xn5xussv18/vnn2rt3ryzL0qBBg9SrVy/TJbWIMIJO65ZbbjmpJ2b8eZFiR3D55Zc3uT0yMlLnn3++br/9dp1zzjkBrqr9ddaf9zfKy8v10ksv+cZJDBo0SNddd51iY2P15ZdfqmvXroYrbHtVVVV6++23FR0dfdytqDVr1ig+Pj4o/6x3RIQRAOikvF6v8vLytGDBAt87XIJFcXGx/vWvfzUasPnss88qKyvLN8/I448/7ntRJsxiACsABDGv16tZs2YpKSlJo0aN0iuvvCLpWA/QOeeco9/97nfNztjZkc2dO1c7duzwrW/btk233nqrXC6XZs6cqVdffVXZ2dkGK8R30TMCAEHs7rvv1tNPPy2Xy6XNmzersrJSGRkZeueddzR79mxNnDixxTE0HVXfvn316quvKikpSZJ0zz33aOPGjdq0aZMkaeXKlcrKytLOnTtNlon/x4vyACCIrVy5Us8++6zGjx+v7du3a9iwYTp69Ki2bt0atLMMS8cGcDqdTt/6xo0bdeWVV/rWL7zwQu3bt89EaWgCt2kAIIh9+umnviejLrjgAoWFhemuu+4K6iAiSU6n0/fm3rq6OpWWluqiiy7y7T98+LC6dOliqjx8D2EEAIJYfX19o0nsQkJCOsWEfldddZVmzpypv/71r5o1a5YiIiJ0ySWX+Pb//e9/18CBAw1WiO/iNg0ABDHLsnTLLbf4nhr56quvdNttt6lbt26N2gXb/CoPPvigrr32Wo0ePVrdu3fX8uXLG4WygoICjRkzxmCF+C4GsAJAEMvIyDipdsE6v0p1dbW6d+9+3CDdgwcPqnv37kH76oOOhjACAACMYswIAAAwijACAACMIowAAACjCCMAAMAowgiA005cXJxyc3NP6TPuv/9+JSQktEk9ANoXYQQAABhFGAEAAEYRRgCc0IsvvqihQ4eqa9euOvPMM+VyubRx40Z16dJFFRUVjdr+6le/8k27vWzZMvXs2VOvvfaazj//fEVEROi6667TkSNHtHz5csXFxalXr1765S9/qfr6+kafc/jwYU2aNEndunVTTEyM8vLyGu0vLy/XNddco+7duysyMlLXX3+9PB5P+/6PANAuCCMAWvTZZ59p0qRJmjJlinbt2qUNGzbo2muvVWJiogYMGKDnnnvO1/brr7/W888/rylTpvi2HTlyRIsWLdKKFSu0bt06bdiwQT/96U+1du1arV27Vs8995yefvppvfjii43O+8gjj2j48OF67733NHPmTE2fPl3r16+XJDU0NOiaa67RwYMHtXHjRq1fv14fffSR0tLSAvM/BUDbsgCgBVu2bLEkWWVlZcftmz9/vjVkyBDf+ksvvWR1797d+uKLLyzLsqylS5dakqy9e/f62vziF7+wIiIirMOHD/u2paamWr/4xS986/3797d+8pOfNDpXWlqadeWVV1qWZVlvvPGG5XA4rPLyct/+HTt2WJKskpISy7IsKysryxo+fPgpXDmAQKFnBECLhg8frh//+McaOnSoJk6cqMWLF+vzzz+XJN1yyy3au3ev3nnnHUnHbstcf/31jV7CFhER0ejtqE6nU3FxcY3eHOt0OnXgwIFG501JSTlufdeuXZKkXbt2KTY2VrGxsb798fHx6tmzp68NgI6DMAKgRQ6HQ+vXr9frr7+u+Ph4Pf744zr//PP18ccfq0+fPho3bpyWLl0qj8ej119/vdEtGknq0qVLo3WbzdbktoaGhna/FgCnJ8IIgBOy2Wy6+OKL9cADD+i9995TaGioXn75ZUnS1KlTVVhYqGeeeUYDBw7UxRdf3Cbn/Ka35bvrQ4YMkSQNGTJE+/bt0759+3z7d+7cqUOHDik+Pr5Nzg8gcEJMFwDg9Pbuu++qqKhIY8aMUZ8+ffTuu++qsrLSFwxSU1MVGRmphx56SHPnzm2z87799ttasGCBJkyYoPXr12vlypVas2aNJMnlcmno0KG68cYblZubq6NHj+qOO+7Q6NGjlZSU1GY1AAgMekYAtCgyMlJ/+ctfdNVVV+m8887Tvffeq4ULF+rKK6+UJNntdt1yyy2qr69Xenp6m53317/+tf72t79pxIgReuihh5STk6PU1FRJx3pqVq9erV69eunSSy+Vy+XSgAEDVFhY2GbnBxA4NsuyLNNFAOjYbr31VlVWVupPf/qT6VIAdEDcpgHQatXV1dq2bZteeOEFggiAViOMAGi1a665RiUlJbrtttt0xRVXmC4HQAfFbRoAAGAUA1gBAIBRhBEAAGAUYQQAABhFGAEAAEYRRgAAgFGEEQAAYBRhBAAAGEUYAQAARhFGAACAUf8HleS+ypE9sDsAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "factor_exposures.f1.sort_values().plot.bar()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "80dde682",
   "metadata": {},
   "source": [
    "Scatter plot of the factor exposures of the first two principal components"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "0527417a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "labels = factor_exposures.index\n",
    "data = factor_exposures.values\n",
    "plt.scatter(data[:, 0], data[:, 1])\n",
    "plt.xlabel(\"Factor exposure of PC1\")\n",
    "plt.ylabel(\"Factor exposure of PC2\")\n",
    "\n",
    "for label, x, y in zip(labels, data[:, 0], data[:, 1]):\n",
    "    plt.annotate(\n",
    "        label,\n",
    "        xy=(x, y),\n",
    "        xytext=(-20, 20),\n",
    "        textcoords=\"offset points\",\n",
    "        arrowprops=dict(arrowstyle=\"->\", connectionstyle=\"arc3,rad=0\"),\n",
    "    )\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c19f5e18",
   "metadata": {},
   "source": [
    "**Jason Strimpel** is the founder of <a href='https://pyquantnews.com/'>PyQuant News</a> and co-founder of <a href='https://www.tradeblotter.io/'>Trade Blotter</a>. His career in algorithmic trading spans 20+ years. He previously traded for a Chicago-based hedge fund, was a risk manager at JPMorgan, and managed production risk technology for an energy derivatives trading firm in London. In Singapore, he served as APAC CIO for an agricultural trading firm and built the data science team for a global metals trading firm. Jason holds degrees in Finance and Economics and a Master's in Quantitative Finance from the Illinois Institute of Technology. His career spans America, Europe, and Asia. He shares his expertise through the <a href='https://pyquantnews.com/subscribe-to-the-pyquant-newsletter/'>PyQuant Newsletter</a>, social media, and has taught over 1,000+ algorithmic trading with Python in his popular course **<a href='https://gettingstartedwithpythonforquantfinance.com/'>Getting Started With Python for Quant Finance</a>**. All code is for educational purposes only. Nothing provided here is financial advise. Use at your own risk."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "eea9a96e-294e-4a2f-ba9e-cfe429f00f5a",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "jupytext": {
   "cell_metadata_filter": "-all",
   "main_language": "python",
   "notebook_metadata_filter": "-all"
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
